Skip to content

12 作业 4

客观题

地址:javascript 基础第四天客观题-pink 老师 (wjx.top)

  1. 在 JavaScript 中,下列有关于自定义函数的说法错误的是()

    js
    A: 自定义函数的关键字是function
    B: 自定义函数必须带有参数
    C: 自定义函数被调用时接受的参数可以是常量变量或其他表达式
    D: 自定义函数返回结果的关键字是return

    答案是 B: 自定义函数不一定必须带有参数。

    在 JavaScript 中,可以定义不需要任何参数的函数。

    js
    function sayHello() {
      console.log("Hello!");
    }
  2. 有以下代码 它的结果是()

    js
    function fn(num1, num2) {
      return num1 + num2;
    }
    alert(fn(10, 20, 30));
    js
    A: 30;
    B: 60;
    C: undefined;
    D: null;

    答案是 A:30。

    函数 fn 只接收两个参数,而在调用时传入了三个参数,第三个参数被忽略,函数返回的结果是前两个参数的和,即 30。

  3. 下列关于函数的参数 描述正确的是()【多选题】

    js
    A: 形参表示形式上的参数 不是一个具体的值
    B: 函数的参数我们可以划分为形参和实参
    C: 实参就是函数调用时传入小括号内的真实数据
    D: 形参和实参的个数一定要匹配否则一定会报错

    答案是 ABC。

    选项 A:形参是在函数定义时声明的参数,它只是函数定义时的占位符,表示函数在调用时需要接收的参数。形参不是具体的值,而是在函数调用时才会被传入具体的实参值。

    选项 B:函数的参数分为形参和实参,形参是函数定义时声明的参数。

    选项 C:实参是函数调用时传入的具体值。

    选项 D:形参和实参的个数可以不匹配,但是需要注意函数内部的处理,如果实参个数少于形参个数,则多余的形参值为 undefined;如果实参个数多于形参个数,则多余的实参值被忽略。

  4. 下列关于函数的描述中,错误的是()

    js
    A: 函数可以返回一个值
    B: 函数可以没有参数
    C: 定义函数时需要返回类型
    D: 函数可以没有 return 关键字

    答案是 C。

    在 JavaScript 中,定义函数时不需要指定返回类型,函数返回值的类型由函数内部的执行结果决定。

  5. 下列关于函数的描述中,错误的是()

    js
    A: 函数封装了一段可以被重复执行的代码块
    B: 通过函数的封装 我们可以大量的复用封装好的功能
    C: 函数让我们的代码更加复杂化
    D: 函数能够多次调用

    答案是 C。

    函数的主要作用是封装可重用的代码块,使代码更加模块化、可维护、可扩展,提高了代码的复用性和可读性。虽然在某些情况下,函数的使用可能会增加代码的复杂度,但这并不是函数的本质特性,而是函数使用不当或设计不合理造成的。

  6. 关于 JavaScript 的作用域,下列描述错误的是()

    js
    A: 根据作用域的不同我们可以把变量分为全局变量和局部变量
    B: 函数的形参也可以看做是局部变量局部变量只能在函数内部使用
    C: 全局变量在浏览器关闭时才会被销毁局部变量在代码块运行结束后就会被销毁
    D: 在函数内部没有声明直接赋值的变量也属于局部变量

    答案是 D。

    在函数内部没有声明直接赋值的变量也属于局部变量是错误的。在 JavaScript 中,如果在函数内部没有使用 varletconst 关键字声明变量,直接给变量赋值,那么该变量会被自动声明为全局变量。

  7. 下面关于函数的返回值,描述正确的是:()

    js
    A: 任何函数必须要有 return 返回值
    B: 函数中可以使用 break 来结束函数的执行
    C: 函数中 return 后面的语句不再执行
    D: 函数可以使用多个 return 返回多个值

    答案是 C。函数中 return 后面的语句不再执行是正确的。当函数执行到 return 语句时,函数会立即停止执行,并将 return 后面的值作为函数的返回值返回。因此,return 之后的语句不会再被执行。

    其他选项是错误的:

    A:并非所有函数都必须要有返回值,例如只是用来输出一些信息的函数就不需要返回值。
    B:函数中使用 break 只能用于循环语句和 switch 语句中,不能用于结束函数的执行。
    D:虽然函数可以使用多个 return 语句,但是一个函数只能返回一个值,当 return 语句被执行时,函数的执行会立即停止,并将 return 后面的值作为返回值返回。

  8. 下面关于函数的返回值,描述错误的是:()

    js
    A: 任何函数必须要有 return 返回值
    B: 如果函数没有返回值那么这个函数的调用结果是 undefined
    C: 通过 return 可以给函数指定返回值
    D: return 可以直接使用表示函数的结束

    答案是 A。任何函数必须要有 return 返回值是错误的。在 JavaScript 中,函数不一定要有返回值。如果函数没有使用 return 语句或者 return 后面没有值,那么函数的返回值是 undefined

    其他选项是正确的:

    B:如果函数没有返回值,那么函数的调用结果是 undefined
    C:通过 return 可以给函数指定返回值,return 后面的值就是函数的返回值。
    D:return 可以直接使用,表示函数的结束,当函数执行到 return 语句时,函数会立即停止执行。

  9. 下列的函数声明中,正确的是:()

    js
    A: Function add(){}
    B: function class(){}
    C: function fn(1,2){}
    D: function fn(a,b){}

    答案是 D。function fn(a,b){} 是正确的。函数声明需要使用 function 关键字,紧接着是函数名和一对圆括号,其中圆括号内可以包含多个参数名,多个参数名之间使用逗号隔开,而参数名必须是合法的标识符。因此,选项 D 是正确的函数声明方式。

    其他选项是错误的:

    A:函数名需要使用合法的标识符,因此 add 不是合法的函数名。
    B:class 是 JavaScript 中的关键字,不能用作函数名。
    C:函数声明中的参数名必须是合法的标识符,因此 12 不是合法的参数名。

  10. 下面关于立即执行函数说法错误是:()

    js
    A: 立即执行函数之间必须用分号间隔开
    B: 立即执行函数的作用是为了减少变量名冲突
    C: 立即执行函数可以添加函数名
    D: 立即执行函数使用非常少推荐尽量不用

    答案是 D。立即执行函数使用非常少,推荐尽量不用是错误的。立即执行函数是 JavaScript 中非常常用的一种模式,可以用来创建私有作用域,避免变量名冲突等问题,因此在实际开发中经常会用到。

    其他选项是正确的:

    A:立即执行函数之间必须用分号间隔开,否则可能会出现语法错误。
    B:立即执行函数的作用之一是为了减少变量名冲突,通过创建私有作用域,让变量不会被外部访问到,从而避免变量名冲突等问题。
    C:立即执行函数可以添加函数名,函数名可以在函数内部使用,但是在外部无法访问。

  11. 求以下函数运算的结果()

    js
    function fn() {
      console.log(100);
    }
    console.log(fn());
    js
    A: 报错
    B: 100 100
    C: 100 undefined
    D: undefined undefined

    答案是 C。

    函数 fn 中使用了 console.log 方法输出了 100,但是函数没有返回值,因此函数调用的结果是 undefined

    在第二行代码中,使用 console.log(fn()) 输出函数的返回值,即 undefined,再加上函数内部输出的 100,因此最终输出结果为 100 undefined

  12. 以下代码运行后 结果为()

    js
    fn(1);
    let fn = function (a) {
      alert(a);
    };
    js
    A: 1;
    B: 程序报错;
    C: alert(1);
    D: undefined;

    答案是 B。程序报错(Uncaught ReferenceError: fn is not defined)。

    函数调用前未定义,因此会报错。

  13. 请问以下代码是几?()

    js
    function f1() {
      let num = 123;
      function f2() {
        console.log(num); //结果是几?
      }
      f2();
    }
    let num = 456;
    f1();
    js
    A: 123
    B: Uncaught ReferenceError: num is not defined
    C: undefined
    D: 456

    答案是 A。在函数 f1 内部定义了一个变量 num,并在函数内部定义了另一个函数 f2,在 f2 中输出了变量 num 的值。在调用 f1 函数之前,全局作用域中也定义了一个变量 num,但是这个变量在 f2 中没有被使用到,因此不会影响结果。因此,最终输出结果是 123

主观题

练习题 1

请看以下代码,并说出执行的流程

javascript
function printfInput(content) {
  // 将用户输入的内容,在页面中显示
  document.write(content);
}
let constr = prompt("请输入内容");
printfInput(constr);

这段代码的执行流程是:

  1. 定义了一个名为 printfInput 的函数,该函数接收一个参数 content,并将该参数的值输出到页面上。
  2. 使用 prompt 弹出一个对话框,提示用户输入内容,并将用户输入的内容赋值给变量 constr
  3. 调用函数 printfInput,并将变量 constr 作为参数传入该函数。
  4. 函数 printfInput 将参数 constr 的值输出到页面上。

因此,整个代码的作用是:获取用户输入的内容,并将该内容输出到页面上。

练习题 2

目标: 求和函数封装练习

要求:

  1. 封装函数,名字为 sum
  2. 功能:根据传入的两个数,求和并且返回求和的结果(函数必须有 return 返回值)
js
function getSum(num1, num2) {
  return num1 + num2;
}

console.log(getSum(1, 2));

练习题 3

目的: 封装函数,复习函数的基本写法。

需求: 实现两个数的值交换 (函数版本)

分析:

  1. 函数名为 changeNum()
  2. 调用函数时, changeNum(1,2)
  3. 经过函数内部处理后,输出 第一个值的结果是2 第二个值的结果是1
  4. 可以多调用两次
js
function changeNum(num1, num2) {
  let temp = num1;
  num1 = num2;
  num2 = temp;
  console.log("第一个值的结果是" + num1 + " 第二个值的结果是" + num2);
}

changeNum(1, 2);
changeNum(5, 10);
changeNum(-1, 0);

练习题 4

目的: 复习函数的声明与调用

题目: 封装余额函数

要求:

  1. 运行程序后,浏览器显示输入确认框 (prompt)
  2. 第一个输入确认框提示输入银行卡余额
  3. 第二个输入确认框提示输入当月食宿消费金额
  4. 第三个输入确认框提示输入当月生活消费金额
  5. 输入完毕后,在页面中显示银行卡剩余金额
  6. 提示:所有功能代码封装在函数内部(函数需要把余额返回)
js
function getBalance() {
  let balance = +prompt("请输入银行卡余额:");
  let foodCost = +prompt("请输入当月食宿消费金额:");
  let lifeCost = +prompt("请输入当月生活消费金额:");
  let remaining = balance - foodCost - lifeCost;
  return remaining;
}

let result = getBalance();
document.write("银行卡剩余金额为:" + result);

练习题 5

目标: 封装一个函数,可以求任意数组的和 或 平均值

要求:

  • 函数可以传递 2 个参数,比如 handleData(arr, true) handleData 处理数据的意思
    • 参数一:接受实参传递过来的数组
    • 参数二:布尔类型 如果是 true 或者不传递参数 是求和操作,如果传递过来的参数是 false 则是求平均值
js
function handleData(arr, isSum = true) {
  if (isSum) {
    return arr.reduce((acc, cur) => acc + cur, 0);
  } else {
    return arr.reduce((acc, cur) => acc + cur, 0) / arr.length;
  }
}

const arr = [1, 2, 3, 4, 5];
console.log(handleData(arr)); // 求和,输出 15
console.log(handleData(arr, true)); // 求和,输出 15
console.log(handleData(arr, false)); // 求平均值,输出 3

拓展题

拓展题 1

需求:封装 some 函数查看数组是否存在某个元素。

  • 要传递 2 个参数 元素、数组
  • 如果数组存在元素则返回 true,如果没有存在元素就返回 false

例如检测 香蕉 是否存在于 数组 [' 苹果 ', ' 香蕉 ', ' 橘子 ', ' 荔枝 ', ' 梨子 '] 中,返回结果是 true

格式如下:

javascript
function some(ele, arr = []) {
  // 里面写业务逻辑
}
let re = some("荔枝", ["苹果", "香蕉", "橘子", "荔枝", "梨子"]);
console.log(re); // true
let re1 = some("榴莲", ["苹果", "香蕉", "橘子", "荔枝", "梨子"]);
console.log(re1); // false
js
function some(ele, arr = []) {
  return arr.includes(ele);
}

let re = some("荔枝", ["苹果", "香蕉", "橘子", "荔枝", "梨子"]);
console.log(re); // true

let re1 = some("榴莲", ["苹果", "香蕉", "橘子", "荔枝", "梨子"]);
console.log(re1); // false

拓展题 2

需求:封装 findeIndex 函数返回查找元素在数组中的索引号。

  • 要传递 2 个参数 元素、数组
  • 如果找到,则返回查找元素在数组中的索引号,如果查找不到,则返回 -1

例如检测 香蕉 数组 [' 苹果 ', ' 香蕉 ', ' 橘子 ', ' 荔枝 ', ' 梨子 '] 中,返回结果是 1

格式如下:

js
// 封装函数返回元素的下标  [1, 5, 10, 22, 8, 7]
// 1. 封装函数 findIndex,传递 2 个参数 元素、数组
function findIndex(ele, arr = []) {
  // 里面写业务逻辑
}
let index1 = findIndex(10, [1, 5, 10, 22, 8, 7]);
console.log(index1); // 2
let index2 = findIndex(8, [1, 5, 10, 22, 8, 7]);
console.log(index2); // 4
let index3 = findIndex(88, [1, 5, 10, 22, 8, 7]);
console.log(index3); // -1
js
function findIndex(ele, arr = []) {
  for (let i = 0; i < arr.length; i++) {
    if (ele === arr[i]) {
      return i;
    }
  }
  return -1;
}

let index1 = findIndex(10, [1, 5, 10, 22, 8, 7]);
console.log(index1); // 2
let index2 = findIndex(8, [1, 5, 10, 22, 8, 7]);
console.log(index2); // 4
let index3 = findIndex(88, [1, 5, 10, 22, 8, 7]);
console.log(index3); // -1
js
function findIndex(ele, arr = []) {
  return arr.indexOf(ele);
}

let index1 = findIndex(10, [1, 5, 10, 22, 8, 7]);
console.log(index1); // 2
let index2 = findIndex(8, [1, 5, 10, 22, 8, 7]);
console.log(index2); // 4
let index3 = findIndex(88, [1, 5, 10, 22, 8, 7]);
console.log(index3); // -1
js
function findIndex(ele, arr = []) {
  return arr.findIndex((item) => item === ele);
}

let index1 = findIndex(10, [1, 5, 10, 22, 8, 7]);
console.log(index1); // 2
let index2 = findIndex(8, [1, 5, 10, 22, 8, 7]);
console.log(index2); // 4
let index3 = findIndex(88, [1, 5, 10, 22, 8, 7]);
console.log(index3); // -1

排错题

排错题 1

js
// bug:请你找到代码返回 NaN 的原因,并进行修改

// 请返回一个数字型的结果 可以使用默认参数或者逻辑中断都可以
function fn(x, y) {
  console.log(x + y);
}
fn(1);

// 答案
// 当调用函数时只传入了一个参数,而函数中却试图将两个参数相加,此时会返回 NaN
// 因为一个数字和 undefined 相加会得到 NaN。为了避免这种情况,可以在函数中对参数进行判断,如果只有一个参数,则将另一个参数默认设置为 0。

// 解决办法
// function fn(x, y = 0) {
function fn(x = 0, y = 0) {
  console.log(x + y);
}
fn(1); // 输出 1

排错题 2

js
// bug:请你找到下面代码的 2 处错误,并进行修改过来

// 任意数组求和案例
function getsumArr(arr) {
  let sum = 0;
  for (let i = 0; i < arr.legnth; i++) {
    sum + arr[i];
  }
  return sum;
}
console.log(getsumArr([10, 20, 30, 40]));

// 答案
// 1. arr.legnth 应该是 arr.length,即将单词 legnth 修改为 length,否则会导致循环无法正确执行,因为循环条件一直为真。
// 2. sum + arr[i] 应该是 sum += arr[i],即将 + 修改为 +=,否则循环中的每次相加都不会对 sum 进行累加,导致最后的结果为 0。

// 解决办法
function getsumArr(arr) {
  let sum = 0;
  for (let i = 0; i < arr.length; i++) {
    sum += arr[i];
  }
  return sum;
}
console.log(getsumArr([10, 20, 30, 40])); // 输出 100